
package com.huaweicloud.saaslanding.install.applicationservice;

import com.alibaba.fastjson.JSONArray;
import com.huaweicloud.saaslanding.basic.idaas.model.MessageInfo;
import com.huaweicloud.saaslanding.basic.idaas.request.IdaasOrg;
import com.huaweicloud.saaslanding.basic.idaas.request.IdaasUser;
import com.huaweicloud.saaslanding.basic.idaas.request.Register;
import com.huaweicloud.saaslanding.basic.idaas.response.InitConsoleAppResponse;
import com.huaweicloud.saaslanding.install.dto.IdaasOrganizationDto;
import com.huaweicloud.saaslanding.install.properties.idaas.IdaasUserProperties;

import java.util.List;
import java.util.Map;

/**
 * 功能描述
 *
 * @since 2022-03-23
 */
public interface IdaasService {

    void initIdaasInfo();

    void deleteIdaasInfo();

    /**
     * 添加用户
     *
     * @param idaasUser 用户实体
     * @return 是否添加成功
     */
    String addUser(IdaasUser idaasUser);

    /**
     * 删除用户
     *
     * @param userId 用户id
     */
    void deleteUser(String userId);

    /**
     * 给用户赋予应用账号
     *
     * @param userId 用户id
     * @param appId 应用id
     * @return 是否赋予成功
     */
    String accountForUser(String userId, String appId);

    /**
     * 查询并删除用户
     *
     * @param userId 用户id
     */
    void getAndDeleteUser(String userId);

    /**
     * 获取用户最高级组织信息
     *
     * @param orgId 组织id
     * @return 组织信息
     */
    IdaasOrg getOrganization(String orgId);

    /**
     * 添加组织
     *
     * @param idaasOrg 组织实体
     * @return 是否添加成功
     */
    String addOrganization(IdaasOrg idaasOrg);

    /**
     * 删除组织
     *
     * @param orgId 组织Id
     */
    void deleteOrganization(String orgId);

    /**
     * 查询并删除组织
     *
     * @param orgId 用户id
     */
    void getAndDeleteOrg(String orgId);

    /**
     * 查询并删除应用账号
     *
     * @param appId 应用id
     * @param accountId 应用账号id
     */
    void getAndDeleteAccount(String appId, String accountId);

    /**
     * 初始化企业并初始化root账户(oneAccess)
     *
     * @return 返回(组织id,用户id,应用账号id)
     */
    Map<String, String> registerOneAccess();

    /**
     * 查询用户列表
     *
     * @param limit 每页显示的条数
     * @param offset 分页偏移量
     * @param orgId 组织id
     * @return 是否赋予成功
     */
    String getUserListInOrg(Integer limit, Integer offset, String orgId);

    /**
     * 批量删除oneaccess用户
     *
     * @param idaasUserPropertiesIdList 要删除的用户列表
     */
    void batchDeleteUser(List<IdaasUserProperties> idaasUserPropertiesIdList);

    /**
     * 获取所有的用户数据
     *
     * @param orgId 组织id
     * @return 用户数据array
     */
    JSONArray getAllUser(String orgId);

    /**
     * 查询某个子
     *
     * @param limit 每页数量。 最小值：10 最大值：100
     * @param offset 分页偏移量，表示从此偏移量开始查询， offset大于等于0
     * @param orgId 父组织id
     * @return 组织信息数据（json）
     */
    String getOrgAlone(Integer offset, Integer limit, String orgId);

    /**
     * 批量删除oneaccess组织(必须传一层组织(租户))
     *
     * @param oneAccessOrganizationLists 要删除的组织列表
     */
    void batchDeleteOrg(List<IdaasOrganizationDto> oneAccessOrganizationLists);

    /**
     * 查询某个组织下的所有子组织
     *
     * @param limit 每页数量。 最小值：10 最大值：100
     * @param offset 分页偏移量，表示从此偏移量开始查询， offset大于等于0
     * @param orgId 组织机构id，获取指定机构及其下的子机构。如果不传递，查询所有根组织。
     * @return 组织信息数据（json）
     */
    String getChildren(String orgId, Integer offset, Integer limit);

    /**
     * 查询某个组织下的所有子组织
     *
     * @param orgId 组织机构id，获取指定机构及其下的子机构。如果不传递，查询所有根组织。
     * @return 组织信息数据（json）
     */
    JSONArray getAloneOrg(String orgId);

    /**
     * 购买套餐
     *
     * @param idaasAppId idaas应用id
     * @param orgCode 组织code
     * @param orgName 组织名称
     * @param messageInfo 请求idaas基本信息
     * @return 返回(key：组织id,value:用户id)
     */
    InitConsoleAppResponse initConsoleApp(String idaasAppId, String orgCode, String orgName, MessageInfo messageInfo);

    /**
     * 购买套餐（keycloak 添加用户 oneaccess 更新用户）
     *
     * @param register 注册实体类
     * @param messageInfo 请求idaas基本信息
     * @return idaasUserId
     */
    String initConsoleContinue(Register register, MessageInfo messageInfo);

    /**
     * 购买套餐注册失败回滚
     *
     * @param register 注册实体
     * @param orgId 组织id
     */
    void registerRollback(Register register, String orgId, MessageInfo messageInfo);
}
